#ifndef _INDICE_ARBOL_H_
#define _INDICE_ARBOL_H_

/********************************************************************
 * IndiceArbol.h
 * 
 * Descripcion :Esta clase representa un archivo de indice primario.
 * implementado con un arbol b o un b+ dependiendo del TipoArchivo pasado
 * por param en el constructor.
*********************************************************************/

#include "indice.h"
#include "arbol_b.h"
#include "arbol_b_mas.h"
#include "archivo.h"

class IndiceArbol: public Indice{
	private:
		ArbolB * arbol;
		TiposArchivo tipo;
		
	public:
	
		IndiceArbol(std::string& nombre, unsigned int tam_bloque,TiposArchivo tipo_indice);
		
		~IndiceArbol();
		
		void crear() throw(ExcepCreandoArch, ExcepSintaxisParser, ExcepBloqueTam); 
		
		void abrir() throw(ExcepAbriendoArch);
		
		void cerrar();
 		
 	 	void eliminar();
 		
 		TiposArchivo get_tipo_archivo();
 		
 		unsigned int get_espacio_libre()  throw(ExcepArchCerrado, ExcepLeerBloque);
 		
 		void ingresar(TipoDato* clave, int num_bloque) throw(ExcepArchCerrado,ExcepRegExistente, ExcepBloqueTam);
		
		void quitar(TipoDato* clave) throw(ExcepArchCerrado);
		
		unsigned int consultar(TipoDato* clave) throw(ExcepArchCerrado,ExcepLeerBloque);
 		
 		void actualizar(TipoDato* clave, int bloque_nuevo) throw(ExcepArchCerrado,ExcepRegInexistente, ExcepBloqueTam);
 		
 		/*
 		 * Dada una clave, devuelve el bloque donde deberia ir si los registros estan
 		 * ordenados por clave primaria.
 		 * El Indice debe ser indice B+.
 		 * Devuelve -1 si el indice no tiene entradas o no es B+.
 		 */
 		int consultar_ubicacion (TipoDato* clave);
 		
 		/*
		 * Get Siguiente: Devuelve el dato del elemento siguiente en el indice al
		 * recien consultado, segun el orden creciente secuencial.
		 * Si era el ultimo devuelve NULL.
		 * Solo para indices B+. Sino devuelve NULL.
		 */
		 TipoInt* get_siguiente();
		 
		 unsigned int get_cant_regs();
		 
		 /*
		 * Devuelve el tamano ocupado por el archivo, en bytes
		 */ 
		long get_tam() throw(ExcepArchCerrado);
		  							
};

#endif

